Hack The Box - Good Games
...

GoodGames.png

Resumen
...

La exploración inicial de la máquina GoodGames se llevó a cabo mediante un escaneo de los puertos expuestos utilizando la herramienta nmap. Este análisis reveló que el puerto 80 estaba abierto, lo que llevó a investigar la página web alojada en dicho puerto. En esta página, se descubrió un panel de autenticación que presentaba una vulnerabilidad de inyección SQL, la cual fue explotada para obtener las credenciales de acceso como usuario admin. Una vez dentro, se identificó un ícono que redirigía a un subdominio, el cual fue agregado al archivo /etc/hosts para su resolución por el navegador. Al acceder al nuevo panel de autenticación con las mismas credenciales, se encontró un campo en la sección de Configuración vulnerable a SSTI. Esto permitió obtener una shell como usuario root, aunque dentro de un contenedor Docker. Posteriormente, se logró el escape del contenedor al enumerar los puertos y descubrir que el puerto 22 estaba abierto. Las credenciales previamente obtenidas se probaron nuevamente, esta vez con el usuario augustus, lo que permitió el acceso al sistema. Para la escalada de privilegios, se notó que la carpeta del usuario augustus estaba montada en el contenedor. Aprovechando esta circunstancia, se copió el archivo /bin/bash a la carpeta de usuario de augustus en el host. Luego, se regresó al contenedor y se modificó el usuario del archivo bash a root, se le otorgaron permisos SUID y finalmente se ejecutó como usuario agustus en el host, obteniendo así una shell con privilegios de root y asegurando la última bandera.

KeyWords: Nmap, SQLi, SSTI, docker breakout, RCE, permissions SUID.

Palabras Clave: Nmap, SQLi, SSTI, docker breakout, RCE, permisos SUID.

Reconocimiento
...

Nmap
...

Se emplea la herramienta Nmap para hacer el reconocimiento de puertos de la máquina Horizontall y de esta forma conocer cuales están abiertos.

> nmap -p- --open -sS --min-rate 1000 -vvv -n -Pn 10.10.11.130 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-28 14:35 CET
Initiating SYN Stealth Scan at 14:35
Scanning 10.10.11.130 [65535 ports]
Discovered open port 80/tcp on 10.10.11.130
Completed SYN Stealth Scan at 14:35, 30.47s elapsed (65535 total ports)
Nmap scan report for 10.10.11.130
Host is up, received user-set (0.049s latency).
Scanned at 2024-01-28 14:35:20 CET for 30s
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap

Nmap done: 1 IP address (1 host up) scanned in 30.63 seconds
           Raw packets sent: 65932 (2.901MB) | Rcvd: 65844 (2.634MB)
Parámetros Nmap
-p-Escanea todos los 65535 puertos
–openSolo muestra los puertos abiertos
-sSEscaneo TCP SYN
–min-rateEnvío mínimo de paquetes
-vvvMuestra la información del escaneo mientras está ejecutándose
-nNo realiza resolución DNS
-PnNo realiza Host Discovery
-oGExporta el output en un archivo con formato grepeable

Se confirma que tiene abiertos los siguientes puertos: 22 (ssh) y 80 (http), por lo que mediante el archivo grepeable que creamos anteriormente, se hara uso de una función personalidada en la .zshrc, que extrae y copia a la clipboard los puertos resultantes de la primera consulta nmap para luego pegarlos en una siguiente.

> extractPorts allPorts
[+] Extracting Information....
  [+] IP Address: 10.10.11.130
  [+] Open Ports: 80
[+] Ports copied to clipboard

Con esta siguiente consulta se buscará enumerar que servicios están expuertos y sus respectivas versiones.

> nmap -sCV -p80 10.10.11.130 -oN targeted
Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-28 14:47 CET
Nmap scan report for internal-administration.goodgames.htb (10.10.11.130)
Host is up (0.039s latency).
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.51
| http-title:     Flask Volt Dashboard -  Sign IN  | AppSeed
|_Requested resource was http://internal-administration.goodgames.htb/login
| http-server-header:
|   Werkzeug/2.0.2 Python/3.6.7
|_  Werkzeug/2.0.2 Python/3.9.2
Service Info: Host: goodgames.htb
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.41 seconds
Parámetros Nmap
-sCConjunto de Scripts básicos de reconocimiento
-sVVerificación de las versiones de los servicios expuestos
-oNGuarda el output en un archivo

Enumeración
...

Puerto TCP 80 - HTTP
...

En la etapa de reconocimiento, se llegó a observar que está abierto el puerto 80. Se procede a enumerar la página expuesta.

HTB - GoodGames/Adjuntos/1_pagina_principal.png

Con el uso de la herramienta whatweb se logra enumerar las tecnologías que usa la página. En el resultado se observa que es que corre por detrás python, importante tener en cuenta esta información.

HTB - GoodGames/Adjuntos/2_whatweb.png

Se encuentra un ventana para iniciar sesión, este puede ser un vector interesante de ataque. Por lo que se captura la petición con burpsuite y se lo pasa al Repeater.

3_ventana_inicio_session.png

4_repeater_login_burp.png

En la petición se prueba realizar una inyección SQL y se confirma que el campo email es vulnerable.

5_sqli_login_burp.png

Explotación
...

SQLi Union Based - Filtración de Credenciales
...

Sabiendo que el campo email es vulnerable a SQLi, se procede a enumerar cuantas columnas tiene mediante la sentencia ORDER BY, por lo que se va a ir probando hasta que muestre algún error. Después de enumerar se observa que tiene un total de cuatro columnas y esta última columna se muestra en pantalla, brindando la posibilidad de poder obtener información de manera mucho más sencilla.

6_sqli_order_by.png

7_sqli_union_based.png

Usando la sentencia SQL, database(), se llega a conocer la base de datos actual, cuyo nombre es "main".

8_sqli_union_based_enum_db.png

Conociendo el nombre de la base de datos, se procede a enumerar las tablas. Dentro de las tablas enumeradas se logra observar una con nombre "user", misma que puede llegar a ser interesante conocer las columnas que posee.

9_sqli_union_based_enum_tables.png

10_sqli_union_based_enum_columns.png

Teniendo en conocimiento las columnas que posee la tabla user, se descubre que el contenido de esta tabla son las credenciales del usuario admin.

11_sqli_union_based_credentials.png

John - Descifrado de contraseña
...

El password está hasheado en md5, a razón que tiene un total de 32 carácteres. Se va copiar el password a un archivo que se llamará hash y por medio de john se logrará descifrarlo. La password de admin es 'superadministrator'.

12_copy_hash_to_file.png

13_hash_john_deshashed_md5.png

SSTI - Shell as root (in a container)
...

Con las credenciales obtenidas se procede a inciar sesión.

14_entramos_admin_click_config.png

Dándole click a la tuerca, lleva a un subdominio que se tendrá que agregar al archivo /etc/hosts.

15_modificamos_etc_hosts.png

En el subdominio se observa otro panel de autenticación, donde se va a probar las credenciales obtenidas anteriormente, que al colocarlas se ingresa a un panel de administración.

16_login_reused_credentials.png

17_admin_page.png

En la sección de configuración (Settings) se prueba que el campo FullName sea vulnerable a Server Side Template Injection (SSTI), y en este caso se confirma que lo es.

18_stti_confirm.png

En la página HackTricks, se busca por SSTI. Dentro de la sección de SSTI se observa en la sección de python para conocer como ejecutar comandos remotos.

19_hacktricks_rce_ssti.png

Se captura la petición para poder enviar el payload.

20_captura_peticion_ssti.png

En el Repeater del burpsuite se procede a realizar el envío del payload que tiene que estár urlencodeado, para que se logre enviar correctamente, para ello cuando se termine de colocar el one liner para obtener la reverse shell se selecciona todo el payload y se presiona la siguiente combinación ctrl+u. Estando en escucha por el puerto 443 en nuestra máquina de atacante se obtiene una shell como el usuario root dentro de un docker.

21_payload_ssti_urlencode.png

22_shell_as_root_docker.png

Docker Breakout - Shell as augustus
...

Dentro del contenedor, se averigua cual es la ip del host.

23_ip_host.png

Teniendo en cuenta la ip del host, se busca que puertos internos están abiertos mediante el uso de bash.

for port in $(seq 1 65535); do timeout 1 bash -c "echo '' > /dev/tcp/172.19.0.1/$port" 2>/dev/null && echo "[+] Puerto Abierto $port"; done

24_escaneo_puertos_internos.png

Se observa que el puerto 22 se encuentra abierto, por lo que ahora toca buscar usaurios y se en la carpeta /home se encuentra la carpeta augustus, que al conocer sus permisos se ve que el usuario no existe por lo que se puede asumir que esta carpeta está montada en el contenedor.

26_usuario_no_existe_compartido_docker.png

Teniendo el nombre de augustus como usuario se prueba si existe nuevamente reuso de credenciales colocando la contraseña 'superadministrator' al iniciar sesión por ssh. Se obtiene la shell como el usuario augustus dentro del host, capturando la user flag.

27_shell_as_augustus.png

Escalada de Privilegios
...

Abuso de Monturas Docker - Shell as root
...

Conociendo que la carpeta augustus del host está montada en el contenedor. Dentro del host, se procede a copiar el binario /bin/bash en /home/augustus, y se regresa la contenedor con el comando exit.

28_copy_bin_bash_augustus_home.png

Estando en el contendor se cambia de usuario del archivo bash, se coloca como owner al usuario root y se asignan permisos SUID.

29_chown_chmod_bash_docker.png

Se regresa al host y al ejecutar esta archivo se obtiene una bash con privilegios, escalando y capturando la última flag.

HTB - GoodGames/Adjuntos/30_shell_as_root.png